home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / scripts / gen_initramfs_list.sh < prev    next >
Encoding:
Linux/UNIX/POSIX Shell Script  |  2008-12-24  |  6.6 KB  |  295 lines

  1. #!/bin/bash
  2. # Copyright (C) Martin Schlemmer <azarah@nosferatu.za.org>
  3. # Copyright (C) 2006 Sam Ravnborg <sam@ravnborg.org>
  4. #
  5. # Released under the terms of the GNU GPL
  6. #
  7. # Generate a cpio packed initramfs. It uses gen_init_cpio to generate
  8. # the cpio archive, and gzip to pack it.
  9. # The script may also be used to generate the inputfile used for gen_init_cpio
  10. # This script assumes that gen_init_cpio is located in usr/ directory
  11.  
  12. # error out on errors
  13. set -e
  14.  
  15. usage() {
  16. cat << EOF
  17. Usage:
  18. $0 [-o <file>] [-u <uid>] [-g <gid>] {-d | <cpio_source>} ...
  19.     -o <file>      Create gzipped initramfs file named <file> using
  20.                gen_init_cpio and gzip
  21.     -u <uid>       User ID to map to user ID 0 (root).
  22.                <uid> is only meaningful if <cpio_source> is a
  23.                directory.  "squash" forces all files to uid 0.
  24.     -g <gid>       Group ID to map to group ID 0 (root).
  25.                <gid> is only meaningful if <cpio_source> is a
  26.                directory.  "squash" forces all files to gid 0.
  27.     <cpio_source>  File list or directory for cpio archive.
  28.                If <cpio_source> is a .cpio file it will be used
  29.                as direct input to initramfs.
  30.     -d             Output the default cpio list.
  31.  
  32. All options except -o and -l may be repeated and are interpreted
  33. sequentially and immediately.  -u and -g states are preserved across
  34. <cpio_source> options so an explicit "-u 0 -g 0" is required
  35. to reset the root/group mapping.
  36. EOF
  37. }
  38.  
  39. # awk style field access
  40. # $1 - field number; rest is argument string
  41. field() {
  42.     shift $1 ; echo $1
  43. }
  44.  
  45. list_default_initramfs() {
  46.     # echo usr/kinit/kinit
  47.     :
  48. }
  49.  
  50. default_initramfs() {
  51.     cat <<-EOF >> ${output}
  52.         # This is a very simple, default initramfs
  53.  
  54.         dir /dev 0755 0 0
  55.         nod /dev/console 0600 0 0 c 5 1
  56.         dir /root 0700 0 0
  57.         # file /kinit usr/kinit/kinit 0755 0 0
  58.         # slink /init kinit 0755 0 0
  59.     EOF
  60. }
  61.  
  62. filetype() {
  63.     local argv1="$1"
  64.  
  65.     # symlink test must come before file test
  66.     if [ -L "${argv1}" ]; then
  67.         echo "slink"
  68.     elif [ -f "${argv1}" ]; then
  69.         echo "file"
  70.     elif [ -d "${argv1}" ]; then
  71.         echo "dir"
  72.     elif [ -b "${argv1}" -o -c "${argv1}" ]; then
  73.         echo "nod"
  74.     elif [ -p "${argv1}" ]; then
  75.         echo "pipe"
  76.     elif [ -S "${argv1}" ]; then
  77.         echo "sock"
  78.     else
  79.         echo "invalid"
  80.     fi
  81.     return 0
  82. }
  83.  
  84. list_print_mtime() {
  85.     :
  86. }
  87.  
  88. print_mtime() {
  89.     local my_mtime="0"
  90.  
  91.     if [ -e "$1" ]; then
  92.         my_mtime=$(find "$1" -printf "%T@\n" | sort -r | head -n 1)
  93.     fi
  94.  
  95.     echo "# Last modified: ${my_mtime}" >> ${output}
  96.     echo "" >> ${output}
  97. }
  98.  
  99. list_parse() {
  100.     echo "$1 \\"
  101. }
  102.  
  103. # for each file print a line in following format
  104. # <filetype> <name> <path to file> <octal mode> <uid> <gid>
  105. # for links, devices etc the format differs. See gen_init_cpio for details
  106. parse() {
  107.     local location="$1"
  108.     local name="${location/${srcdir}//}"
  109.     # change '//' into '/'
  110.     name="${name//\/\///}"
  111.     local mode="$2"
  112.     local uid="$3"
  113.     local gid="$4"
  114.     local ftype=$(filetype "${location}")
  115.     # remap uid/gid to 0 if necessary
  116.     [ "$root_uid" = "squash" ] && uid=0 || [ "$uid" -eq "$root_uid" ] && uid=0
  117.     [ "$root_gid" = "squash" ] && gid=0 || [ "$gid" -eq "$root_gid" ] && gid=0
  118.     local str="${mode} ${uid} ${gid}"
  119.  
  120.     [ "${ftype}" == "invalid" ] && return 0
  121.     [ "${location}" == "${srcdir}" ] && return 0
  122.  
  123.     case "${ftype}" in
  124.         "file")
  125.             str="${ftype} ${name} ${location} ${str}"
  126.             ;;
  127.         "nod")
  128.             local dev=`LC_ALL=C ls -l "${location}"`
  129.             local maj=`field 5 ${dev}`
  130.             local min=`field 6 ${dev}`
  131.             maj=${maj%,}
  132.  
  133.             [ -b "${location}" ] && dev="b" || dev="c"
  134.  
  135.             str="${ftype} ${name} ${str} ${dev} ${maj} ${min}"
  136.             ;;
  137.         "slink")
  138.             local target=`readlink "${location}"`
  139.             str="${ftype} ${name} ${target} ${str}"
  140.             ;;
  141.         *)
  142.             str="${ftype} ${name} ${str}"
  143.             ;;
  144.     esac
  145.  
  146.     echo "${str}" >> ${output}
  147.  
  148.     return 0
  149. }
  150.  
  151. unknown_option() {
  152.     printf "ERROR: unknown option \"$arg\"\n" >&2
  153.     printf "If the filename validly begins with '-', " >&2
  154.     printf "then it must be prefixed\n" >&2
  155.     printf "by './' so that it won't be interpreted as an option." >&2
  156.     printf "\n" >&2
  157.     usage >&2
  158.     exit 1
  159. }
  160.  
  161. list_header() {
  162.     :
  163. }
  164.  
  165. header() {
  166.     printf "\n#####################\n# $1\n" >> ${output}
  167. }
  168.  
  169. # process one directory (incl sub-directories)
  170. dir_filelist() {
  171.     ${dep_list}header "$1"
  172.  
  173.     srcdir=$(echo "$1" | sed -e 's://*:/:g')
  174.     dirlist=$(find "${srcdir}" -printf "%p %m %U %G\n")
  175.  
  176.     # If $dirlist is only one line, then the directory is empty
  177.     if [  "$(echo "${dirlist}" | wc -l)" -gt 1 ]; then
  178.         ${dep_list}print_mtime "$1"
  179.  
  180.         echo "${dirlist}" | \
  181.         while read x; do
  182.             ${dep_list}parse ${x}
  183.         done
  184.     fi
  185. }
  186.  
  187. # if only one file is specified and it is .cpio file then use it direct as fs
  188. # if a directory is specified then add all files in given direcotry to fs
  189. # if a regular file is specified assume it is in gen_initramfs format
  190. input_file() {
  191.     source="$1"
  192.     if [ -f "$1" ]; then
  193.         ${dep_list}header "$1"
  194.         is_cpio="$(echo "$1" | sed 's/^.*\.cpio\(\..*\)\?/cpio/')"
  195.         if [ $2 -eq 0 -a ${is_cpio} == "cpio" ]; then
  196.             cpio_file=$1
  197.             echo "$1" | grep -q '^.*\.cpio\..*' && is_cpio_compressed="compressed"
  198.             [ ! -z ${dep_list} ] && echo "$1"
  199.             return 0
  200.         fi
  201.         if [ -z ${dep_list} ]; then
  202.             print_mtime "$1" >> ${output}
  203.             cat "$1"         >> ${output}
  204.         else
  205.             cat "$1" | while read type dir file perm ; do
  206.                 if [ "$type" == "file" ]; then
  207.                     echo "$file \\";
  208.                 fi
  209.             done
  210.         fi
  211.     elif [ -d "$1" ]; then
  212.         dir_filelist "$1"
  213.     else
  214.         echo "  ${prog}: Cannot open '$1'" >&2
  215.         exit 1
  216.     fi
  217. }
  218.  
  219. prog=$0
  220. root_uid=0
  221. root_gid=0
  222. dep_list=
  223. cpio_file=
  224. cpio_list=
  225. output="/dev/stdout"
  226. output_file=""
  227. is_cpio_compressed=
  228.  
  229. arg="$1"
  230. case "$arg" in
  231.     "-l")    # files included in initramfs - used by kbuild
  232.         dep_list="list_"
  233.         echo "deps_initramfs := \\"
  234.         shift
  235.         ;;
  236.     "-o")    # generate gzipped cpio image named $1
  237.         shift
  238.         output_file="$1"
  239.         cpio_list="$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)"
  240.         output=${cpio_list}
  241.         shift
  242.         ;;
  243. esac
  244. while [ $# -gt 0 ]; do
  245.     arg="$1"
  246.     shift
  247.     case "$arg" in
  248.         "-u")    # map $1 to uid=0 (root)
  249.             root_uid="$1"
  250.             shift
  251.             ;;
  252.         "-g")    # map $1 to gid=0 (root)
  253.             root_gid="$1"
  254.             shift
  255.             ;;
  256.         "-d")    # display default initramfs list
  257.             default_list="$arg"
  258.             ${dep_list}default_initramfs
  259.             ;;
  260.         "-h")
  261.             usage
  262.             exit 0
  263.             ;;
  264.         *)
  265.             case "$arg" in
  266.                 "-"*)
  267.                     unknown_option
  268.                     ;;
  269.                 *)    # input file/dir - process it
  270.                     input_file "$arg" "$#"
  271.                     ;;
  272.             esac
  273.             ;;
  274.     esac
  275. done
  276.  
  277. # If output_file is set we will generate cpio archive and gzip it
  278. # we are carefull to delete tmp files
  279. if [ ! -z ${output_file} ]; then
  280.     if [ -z ${cpio_file} ]; then
  281.         cpio_tfile="$(mktemp ${TMPDIR:-/tmp}/cpiofile.XXXXXX)"
  282.         usr/gen_init_cpio ${cpio_list} > ${cpio_tfile}
  283.     else
  284.         cpio_tfile=${cpio_file}
  285.     fi
  286.     rm ${cpio_list}
  287.     if [ "${is_cpio_compressed}" = "compressed" ]; then
  288.         cat ${cpio_tfile} > ${output_file}
  289.     else
  290.         cat ${cpio_tfile} | gzip -f -9 - > ${output_file}
  291.     fi
  292.     [ -z ${cpio_file} ] && rm ${cpio_tfile}
  293. fi
  294. exit 0
  295.